<?php

class TurnsController extends AppController {

    var $name = 'Turns';
    var $uses = array('Turn', 'Person', 'Stateturn', 'Product', 'Agenda', 'User');
    var $actsAs = array('Acl' => array('type' => 'controlled'));

    function beforeFilter() {
        parent::beforeFilter();

        // Aplico el Layout segun la Vista o si es AJAX
        if ($this->RequestHandler->isAjax()) {
            $this->layout = 'ajax';
        } else {
            // Cambio la Vista por la del Rol
            $this->layout = strtolower($this->Session->read('VistaActual'));
        }
    }

    function index($id_paciente = null, $archivados = null) {
        $this->Turn->recursive = 0;

        if (!$archivados) {
            $turns = $this->Turn->find('all', array(
                'conditions' => array(
                    'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                    'Turn.person_id' => $id_paciente,
                    'NOT' => array('Turn.staterecord_id' => array('2', '3'))
                )
                    ));
        } else { // Para mostrar tambien los registros ARCHIVADOS
            $turns = $this->Turn->find('all', array(
                'conditions' => array(
                    'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                    'Turn.person_id' => $id_paciente,
                    'NOT' => array('Turn.staterecord_id' => array('2'))
                )
                    ));
        }
        $this->set('archivados', $archivados);

        $this->set('doctores', $this->requestAction('/users/obtenerListadoDoctores/' . $this->Session->read('ClientesUsuarioLogueado.id')));
        $this->set('turns', $turns);
        $this->set('id_paciente', $id_paciente);
        $this->layout = 'ajax';
    }

    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Invalid turn', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('turn', $this->Turn->read(null, $id));
    }

    function add($anio = null, $mes = null, $dia = null, $hora = null, $minutos = null, $id_profesional = null, $sobreturno = "N", $id_paciente = null, $id_agenda = 0) {

        $this->_accede('carga_turnos');

        if (!empty($this->data)) {

            // Si no fue marcado que es paciente temporario
            if (empty($this->data['Turn']['apellido'])) {
                $esPacienteTemporario = "N";
                $nota_json = '';
                $nota = '';
            } else {
                $esPacienteTemporario = "S";
                $x = $this->data['Turn'];
                $nota = $x['apellido'] . ', ' . $x['nombre'] . '<br/>Email:' . $x['email'] . '<br/>Telefono:' . $x['telefono'] . '<br/>Financiador:' . $x['financiador'];
                // Estas notas json se utilizan para pre-cargar los datos del paciente en el formulario de alta
                $nj['lastname'] = $x['apellido'];
                $nj['name'] = $x['nombre'];
                $nj['email'] = $x['email'];
                $nj['telefono'] = $x['telefono'];
                $nj['financiador'] = $x['financiador'];
                $nota_json = json_encode($nj);
            }



            // Si no fue marcado que es sobreturno
            if (empty($this->data['Turn']['sobreturno'])) {
                $esSobreturno = "N";
            } else {
                $esSobreturno = "S";
            }

            // Si el Paciente no se selecciono y el Paciente no es Temporario
            if (empty($this->data['Turn']['person_id']) AND $esPacienteTemporario == "N") {
                $this->Session->setFlash(__('Debe seleccionar un Paciente', true), 'default', array('class' => 'error-message'));

                if (!$id_paciente) {
                    $this->redirect('/calendarios/semanal/' . $this->data['Turn']['fecha']['year'] . '/' . $this->data['Turn']['fecha']['month'] . '/' . $this->data['Turn']['fecha']['day'] . '/' . $this->data['Turn']['doctor_id']);
                    exit;
                } else {
//					$this->redirect('/people/view/'.$id_paciente.'/99');
                    // $this->redirect('/dashboards');

                    $this->redirect('/calendarios/semanal/' . $this->data['Turn']['fecha']['year'] . '/' . $this->data['Turn']['fecha']['month'] . '/' . $this->data['Turn']['fecha']['day'] . '/' . $this->data['Turn']['doctor_id']);
                    exit;
                }
                exit;
            }

            // Si el Paciente se selecciono y el Paciente es Temporario
            if (!empty($this->data['Turn']['person_id']) AND $esPacienteTemporario == "S") {
                $this->data['Turn']['person_id'] = 0;
            }

            $this->Turn->create();

            // Seteo datos que no vienen del Formulario
            $this->Turn->set(array(
                'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                'user_id' => $this->Auth->user('id'),
                'nota' => $nota,
                'nota_json' => $nota_json,
                'stateturn_id' => '1',
                'sobreturno' => $esSobreturno,
                'confirm' => date("Y-m-d H:i:s")
            ));

            if ($this->Turn->save($this->data)) {

                // Se actualizan las Sesiones
                $this->actualizarTurnos();


                //Interface con ETM para el cliente "Consultorio de la Mujer"
                if ($this->Session->read('ClientesUsuarioLogueado.id') == 2032) {

                    $client = new SoapClient('http://50.62.77.140:9090/ETMApi/api');

                    // Seteo los datos de ETM
                    $id_institucion = 2017;
                    $ws_key = 'ttdge45d33';
                    $id_medico = 4728;
                    $id_paciente = 0;

                    // Seteo los datos internos de Epicrisis					
                    $codext_medico = $this->Auth->user('id');
                    $codext_paciente = $this->data['Turn']['person_id'];
                    $tipodoc_paciente = '';
                    $dni_paciente = '';


                    $nombre_paciente = '';
                    $apellido_paciente = '';
                    $email_paciente = '';
                    $celular_paciente = '';
                    $estado_turno = 0;
                    $id_turno = 0;
                    $id_turno_actualizado = 0;
                    $id_plan = 0;
                    $codext_plan = '';
                    $permite_sobreturnos = 0;
                    $nrosocio_paciente = '';


                    // Obtengo el ID de Agenda de ETM
                    $response = $client->getAgendas($id_institucion, $ws_key, $id_medico, $codext_medico);

                    if ($response['error']['codigo'] == 0) { //and  !empty($response['items'])
                        $id_agenda = $response['items'][0]['id'];
                    }


                    // Obtengo los datos del paciente para pasarselo a ETM
                    $datos_persona = $this->Person->read(null, $codext_paciente);


                    // Doy de alta el turno en ETM
                    $response = $client->tomarTurno($id_institucion, $ws_key, $id_medico, $codext_medico, $id_plan, $codext_plan, $id_turno, '20131118', '09:30', $permite_sobreturnos, $id_paciente, $codext_paciente, $datos_persona['Person']['typodocument_id'], $datos_persona['Person']['nro_documento'], trim($datos_persona['Person']['name'] . ' ' . $datos_persona['Person']['name2'] . ' ' . $datos_persona['Person']['name3']), trim($datos_persona['Person']['lastname'] . ' ' . $datos_persona['Person']['lastname2'] . ' ' . $datos_persona['Person']['lastname3']), $datos_persona['Person']['email'], $datos_persona['Person']['telefono'], $nrosocio_paciente);
                }


                $agenda_id = $this->data['Turn']['agenda_id'];
                if ($this->data['Turn']['stateturn_id'] == 2) {
                    // Vino de Demanda espontanea
                    // Si es una Persona Temporaria
                    if ($this->data['Turn']['person_id'] == 0) {
                        $this->Session->setFlash(__('El Turno Temporario ha sido guardado', true));
                        $this->redirect('/dashboards/index/0/0/' . $agenda_id);
                        exit;
                    } else {
                        $this->Session->setFlash(__('El Turno ha sido guardado', true));
                        $this->redirect('/dashboards/index/0/0/' . $agenda_id);
                        exit;
                    }
                } else {
                    // Si es una Persona Temporaria
                    if ($this->data['Turn']['person_id'] == 0) {
                        $this->Session->setFlash(__('El Turno Temporario ha sido guardado', true));

                        $this->redirect('/calendarios/semanal/' . $this->data['Turn']['fecha']['year'] . '/' . $this->data['Turn']['fecha']['month'] . '/' . $this->data['Turn']['fecha']['day'] . '/' . $this->data['Turn']['doctor_id']);
                        exit;
                    } else {
                        $this->Session->setFlash(__('El Turno ha sido guardado', true));

                        $this->redirect('/calendarios/semanal/' . $this->data['Turn']['fecha']['year'] . '/' . $this->data['Turn']['fecha']['month'] . '/' . $this->data['Turn']['fecha']['day'] . '/' . $this->data['Turn']['doctor_id']);

                        exit;
                    }
                }
            } else {
                $this->Session->setFlash(__('El Turno no pudo ser guardado. Por favor, intente luego.', true));
            }
        }

        if ($id_paciente) {
            $people = $this->Person->find('list', array(
                'conditions' => array(
                    'Person.id' => $id_paciente,
                ),
                'fields' => array('Person.id', 'Person.full_name')
                    ));
        }

        if ($anio == 'ESPONTANEA') {
            $this->set('fecha_completa', date("Y-m-d H:i"));
            $this->set('demanda_espontanea', "S");
        } else {
            $this->set('fecha_completa', "$anio-$mes-$dia $hora:$minutos");
            $this->set('demanda_espontanea', "N");
        }


        //---------------------------------------------------------------
        //                Si no hay Profesional elegido, tomo el logueado
        //---------------------------------------------------------------
        if (!$id_profesional) {
            $id_profesional = $this->Auth->user('id');
        }
        $this->User->recursive = -1;
        $User = $this->User->read(null, $id_profesional);
        $this->Set('User', $User);


        // --- Obtiene los productos de ese medico
        $sql = "select products.id, products.name from products 
				left join products_users on products_users.product_id = products.id
				where products_users.user_id='$id_profesional' ";
        $xProductos = $this->Product->query($sql);
        $Productos = array();
        foreach ($xProductos as $xp) {
            $Productos[$xp['products']['id']] = $xp['products']['name'];
        }
        $this->set(compact('Productos'));

        //-------------------------------------------------------------------
        // Cuales son las Agendas de ese Medico?
        //-------------------------------------------------------------------
        $id_agenda = $this->Session->read('AgendaSeleccionada');
        $ag = $this->Agenda->read(null, $id_agenda);
        $this->set('id_agenda', $id_agenda);
        $this->set('agenda_nombre', $ag['Agenda']['nombre']);

        $this->set(compact('people'));
        $this->set('id_paciente', $id_paciente);
        $this->set('id_profesional', $id_profesional);
        $this->set('sobreturno', $sobreturno);
    }

    function edit($id = null, $id_paciente = null) {

        $this->_accede('carga_turnos');

        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Invalid turn', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {

            // Seteo datos que no vienen del Formulario
            $this->Turn->set(array(
                'user_id' => $this->Auth->user('id'),
            ));

            if ($this->Turn->save($this->data)) {
                $this->Session->setFlash(__('The turn has been saved', true));
                $this->redirect('/people/view/' . $this->data['Turn']['person_id'] . '/99');
            } else {
                $this->Session->setFlash(__('The turn could not be saved. Please, try again.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Turn->read(null, $id);
        }

        if (!$id_paciente) {
            exit;
        }

        $people = $this->Person->find('list', array(
            'fields' => array('Person.id', 'Person.full_name')
                ));

        $this->set('doctors', $this->requestAction('/users/obtenerListadoDoctores/' . $this->Session->read('ClientesUsuarioLogueado.id')));
        $stateturns = $this->Turn->Stateturn->find('list');
        $this->set('id_paciente', $id_paciente);
        $this->set(compact('people', 'stateturns'));
    }

    function archivar($id = null, $id_paciente = null, $estado = null) {
        if (!$id) {
            $this->Session->setFlash(__('Turno no valido', true));
            $this->redirect('/dashboards');
        }

        if (!$id_paciente) {
            $this->Session->setFlash(__('Paciente no valido', true));
            $this->redirect('/dashboards');
        }

        if (!$estado) {
            $this->Session->setFlash(__('Estado no valido', true));
            $this->redirect('/dashboards');
        }

        $this->Turn->id = $id;
        $this->Turn->set(array(
            'staterecord_id' => $estado,
            'user_id' => $this->Auth->user('id'),
        ));


        if ($this->Turn->save()) {
            $this->Session->setFlash(__('El Turno fue procesado.', true));
            $this->redirect('/people/view/' . $id_paciente . '/99');
        }
        $this->Session->setFlash(__('El Turno no pudo ser procesado', true));
        $this->redirect('/people/view/' . $id_paciente . '/99');
    }

    function proximos() {

        if (!$proximos_turnos = Cache::read('proximos_turnos_' . $this->Session->read('ClientesUsuarioLogueado.id') . '_' . $this->Session->read('ProfesionalSeleccionado'))) {

            $proximos_turnos = $this->Turn->find('all', array(
                'conditions' => array(
                    'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                    'Turn.doctor_id' => $this->Session->read('ProfesionalSeleccionado'),
                    'Turn.fecha BETWEEN ? AND ?' => array(date("Y-m-d"), date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") + 1, date("Y")))),
                    'NOT' => array('Turn.staterecord_id' => array('2', '3'))
                ),
                'order' => array('Turn.orden')
            ));

            Cache::write('proximos_turnos_' . $this->Session->read('ClientesUsuarioLogueado.id') . '_' . $this->Session->read('ProfesionalSeleccionado'), $proximos_turnos);
        }

        $this->set('turnos', $proximos_turnos);
        $this->set('doctores', $this->requestAction('/users/obtenerListadoDoctores/' . $this->Session->read('ClientesUsuarioLogueado.id')));
        $this->set('stateturns', $this->Stateturn->find('list', array('order' => array('Stateturn.name'))));
    }

    function actualizarTurnos() {
        Cache::delete('proximos_turnos_' . $this->Session->read('ClientesUsuarioLogueado.id') . '_' . $this->Session->read('ProfesionalSeleccionado'));
        $this->autoRender = false;
    }

    // Cambia un Turno a un determinado Esstado
    function setEstadoTurno($id_turno = null, $id_paciente = null, $id_nuevo_estado = null) {
        // Si esta definido el Turno y el Paciente
        if (!empty($id_turno) AND ! empty($id_paciente) AND ! empty($id_nuevo_estado)) {

            // Obtengo datos del Objeto
            $this->Turn->id = $id_turno;


            // Registro la hora de llegada del paciente
            if (empty($this->Turn->hora_llegada) AND $id_nuevo_estado == 2) {
                $this->Turn->saveField('hora_llegada', date("Y-m-d H:i"));
            }

            // Registro la hora de atencion del paciente
            if (empty($this->Turn->hora_atendido) AND $id_nuevo_estado == 5) {
                $this->Turn->saveField('hora_atendido', date("Y-m-d H:i"));
            }


            // Si lo pudo grabar
            if ($this->Turn->saveField('stateturn_id', $id_nuevo_estado)) {

                // Se actualizan las Sesiones
                $this->actualizarTurnos();

                echo $id_nuevo_estado;
            } else { // Si no pudo
                echo "N";
            }
        }
        $this->autoRender = false;
    }

    function cambiarestado($id = null, $id_paciente = null) {

        if ($id) {

            // Averiguo los estados posibles de los Turnos
            if ($id_paciente) { // Si el paciente ya está cargado en la BD
                $arreglo_estados_turnos = $this->Stateturn->find('list', array(
                    'order' => array('Stateturn.id')
                ));
            } else { // Si es un Paciente TEMPORAL
                $arreglo_estados_turnos = $this->Stateturn->find('list', array(
                    'conditions' => array(
                        'Stateturn.id' => array('1', '3'),
                    ),
                    'order' => array('Stateturn.id')
                ));
            }

            // Obtengo datos del Objeto
            $this->Turn->id = $id;
            $estado_actual = $this->Turn->field('stateturn_id');


            // Determino el Seguiente Estado a asignar
            if (array_key_exists($estado_actual, $arreglo_estados_turnos)) {

                $valor_guardar = key($arreglo_estados_turnos);


                reset($arreglo_estados_turnos);
                foreach ($arreglo_estados_turnos AS $indice => $valor_aux) {

                    // Si encontre el estado actual, entonces selecciono el siguiente posible
                    if ($indice == $estado_actual) {

                        // Si es el ultimo elemento de la lista
                        if (next($arreglo_estados_turnos) === FALSE) {
                            reset($arreglo_estados_turnos);
                        }

                        $elem_actual = each($arreglo_estados_turnos);
                        $valor_guardar = $elem_actual['key'];

                        break;
                    }
                    next($arreglo_estados_turnos);
                }
            } else {
                reset($arreglo_estados_turnos);
                $elem_actual = each($arreglo_estados_turnos);
                $valor_guardar = $elem_actual['key'];
            }
            // Si lo pudo grabar
            if ($this->Turn->saveField('stateturn_id', $valor_guardar)) {

                // Se actualizan las Sesiones
                $this->actualizarTurnos();

                echo $valor_guardar;
            } else { // Si no pudo
                echo "N";
            }
        }
        $this->autoRender = false;
    }

    function ordenar() {
        if (isset($_POST['items'])) {
            $sortableitems = $_POST['items'];

            $i = 0;
            foreach ($sortableitems as $item) {
                $this->Turn->id = $item;
                $this->Turn->saveField('orden', $i);
                $i++;
            }

            // Se actualizan las Sesiones
            $this->actualizarTurnos();
        }
    }

    function cancelar($arreglo_id = null) {
        $this->_accede('cancela_turnos');

        // Si existen turnos para cancelar
        if ($arreglo_id) {

            $arreglo_id_turnos = explode("|", $arreglo_id);

            foreach ($arreglo_id_turnos AS $id_turno_aux) {

                if (!empty($id_turno_aux)) {
                    // Identifico el Turno
                    $this->Turn->id = $id_turno_aux;

                    // Cancelo el Turno
                    $this->Turn->saveField('stateturn_id', "3");
                }
            }

            // Se actualizan las Sesiones
            $this->actualizarTurnos();

            echo "S";
            exit;
        } else {
            echo "N";
            exit;
        }
    }

    function ObtenerTurnos($fecha_inicio = null, $fecha_fin = null, $profesional_id = null, $agenda_id = 0) {

        $client_tz = new DateTimeZone($_SESSION['Client']['timezone']);
        $date = new DateTime();
        $date->setTimezone($client_tz);


        // Si no esta definida la Fecha de Inicio => es HOY
        if (!$fecha_inicio) {
            $fecha_inicio = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d"), date("Y")));
        }
        $tz_fecha_inicio = $date->format($fecha_inicio);


        // Si no esta definida la Fecha de Fin => es HOY
        if (!$fecha_fin) {
            $fecha_fin = date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("d"), date("Y")));
        }
        $tz_fecha_fin = $date->format($fecha_fin);

        // Si no esta definido el Profesional, muestro los Turnos de Todos
        if (!$agenda_id) {
            $condicion_profesional = array(
                'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                'Turn.fecha BETWEEN ? AND ?' => array($tz_fecha_inicio, $tz_fecha_fin),
                'NOT' => array('Turn.staterecord_id' => array('2', '3'))
            );
        } else {
            $condicion_profesional = array(
                'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                'Turn.agenda_id' => $agenda_id,
                'Turn.fecha BETWEEN ? AND ?' => array($tz_fecha_inicio, $tz_fecha_fin),
                'NOT' => array('Turn.staterecord_id' => array('2', '3'))
            );
        }
//pr($condicion_profesional);


        $lst_turnos = $this->Turn->find('all', array(
            'conditions' => $condicion_profesional,
            'order' => array('Turn.fecha')
        ));

        return $lst_turnos;
    }

    function listadoturnos($fecha_inicio = null, $fecha_fin = null, $profesional = null) {

        if (!$fecha_inicio) {
            $fecha_inicio = date("Y-m-d");
        }

        if (!$fecha_fin) {

            $anio_inicio = substr($fecha_inicio, 0, 4);
            $mes_inicio = substr($fecha_inicio, 5, 2);
            $dia_inicio = substr($fecha_inicio, 8, 2);

            $fecha_fin = date("Y-m-d", mktime(0, 0, 0, $mes_inicio, $dia_inicio + 1, $anio_inicio));
        }

        $listado_turnos = $this->ObtenerTurnos($fecha_inicio, $fecha_fin, $this->Session->read('ProfesionalSeleccionado'));

        $this->set('listado_turnos', $listado_turnos);
        $this->set('listado_productos', $this->Product->find('list'));
    }

}

?>